﻿/**
 *参考资料：
 *	功能：对文章参考资料 增删改查,页面初始化时调用Util.initDate从服务端获取该文章相关参考资料与编辑器中文章已有参考资料比较，
 *		取出交集保存在Util.tmp_ajax_date中,同时删除文章中有服务端没有的无效参考资料记录，Util.tmp_ajax_date数据在插件的one方法中调用一次初始化面板，
 *		面板中自定义事件实现方法全部在Funs对象中，通过plugin.action调用Funs【注意在action中对所有操作均判断Util.ajaxBusy,
 *		如果正在处理请求则不进一步触发事件，同时如果点击的a标签返回false兼容IE】，
 *		通过name属性与方法名对应相关联，同时增加参考资料快捷菜单。
 *		【由于设计ajax交互，因此插件提供两个外部可实现接口getSaveUrl和getSelectUrl
 *		分别负责获取保存地址和查询地址，没提供则默认使用变量defaultSaveUrl和defaultSelectUrl】
 *	主要函数功能介绍：
 *	plugin.editor_callback : 功快捷菜单编辑调用，简单调用插件的click方法弹出面板后，
 *							再调用要编辑响的编辑按钮click方法就可以完成编辑界面初始化
 *	Funs.add : 显示增加参考资料界面并加载面板最下面，存在则显示，不存在则创建再显示，
 *				同时显示正处于编辑状态的参考资料记录，注意这里需要把操作界面li的editor_id属性设置为空，
 *				同时维护标题前面的索引值，这里索引值正好等于面板中参考资料记录条数加1。
 *	Funs.save : 保存修改或者新增记录，这里修改和增加都是调用同一个url，区别修改和删除状态是依靠 操作界面li的editor_id属性值
 *				如果不存在则表示删除，如果存在则表示修改，修改成功后生成新的一条记录替换原来记录，同时隐藏操作界面
 *	Funs.cancel : 取消操作，先更具editor_id判断是取消的删除还是编辑，如果是编辑则在隐藏操作界面后显示出被编辑的记录，
 *				同时重置操作界面所有信息。
 *	Funs.remove : 删除参考资料，根据单击的删除按钮获取删除记录的id，删除面板中的记录，
 *				根据id查找编辑器中name等于id的sup标签，批量删除，
 *				然后遍历面板中剩余记录，重新排列索引值，并修改编辑器中对应记录索引值，
 *				最后如果编辑或者增加界面显示了的话也修改其显示索引值。
 *	Funs.editor : 弹出编辑框，隐藏被编辑记录，如果编辑框存在则显示在被编辑记录下方，
 *				不存在则创建后显示在被编辑记录下方，同时获取该记录相关信息初始化编辑框。
 *	Util.getAddMod : 获取编辑或者增加面板模版。
 *	Util.getReferMod : 根据传入参数返回一条记录html模版。
 *	Util.removeNodes :  批量删除节点，参数必须为普通数组类型。
 *	Util.updateNodesText : 批量修改节点的内容。
 *	Util.ajax : 负责该插件所有ajax请求
 *	Util.initDate : 获取并记录有效数据，同时删除无效数据，页面加载完成后立刻执行
 */
(function(E){

E.Event.bind('oncomplete',function(){
	//获取并记录有效数据，同时删除无效数据
	Util.initDate();
});

var Consts = E.consts ,
	pluginName = 'Reference',
	refer_value = '<h2>参考资料</h2>',
	defaulturl = 'http://',
	defaultSaveUrl = 'http://www.baike.com/wikdoc/sp/addDocComments.do',
	defaultSelectUrl = 'http://www.baike.com/wikdoc/sp/getCommentsList.do',
	//上标样式类名
	referClass = 'refer';
// 参考资料快捷菜单
E.mod("Menu").add('mouseup', {
	title: '参考资料快捷菜单',
	check: function( cursorElement ){
		var bool = false, node;
		if ( cursorElement && (typeof cursorElement === 'object')) {
			node = $(cursorElement);
			if( cursorElement.nodeName.toLowerCase() == 'sup' &&
				referClass == node.attr('class')) {
				bool = true;
			}
		}
		return bool;
	},
	getHtml: function( cursorElement ){
		var html ='<a name="ShortcutMenu" method="editRefer" plugin="'+pluginName+'">编辑</a> <a name="ShortcutMenu" method="removeRefer">删除</a>';
		return {className:'jqe-shortcut-menu', html:html};
	}
});

E.plugin(pluginName, {
	inserthtml: 'custom',
	is_editoring: false,
	config:{
		width: 520,
		position: 'center',
		overlay: true
	},
	style : '.jqe-plugin-Reference{width:500px;overflow-x:hidden;font:12px/1.2 宋体,Arial,Helvetica,sans-serif;background:none repeat scroll 0 0 #FFFFFF;}\
		.jqe-plugin-Reference a{color:#0268CD;text-decoration:none;}\
		.jqe-plugin-Reference p{margin:0;padding:0;}\
		.jqe-plugin-Reference a:hover{text-decoration:underline;}\
		.jqe-plugin-Reference #referlist{width:490px;height:250px;overflow-y:scroll;overflow-x:hidden;border:1px solid #CCCCCC;line-height:18px;padding:5px;margin:0;}\
		.jqe-plugin-Reference #referlist li{padding:10px 0 10px 25px;list-style:none;display:inline-block;width:450px;}\
		.jqe-plugin-Reference .refer_item input{margin:0px 0px 0px -20px;float:left;height:18px;}\
		.jqe-plugin-Reference .refer_item a{float:right;margin-left:5px;margin-right:5px;}\
		.jqe-plugin-Reference .refer_item span.title{width:360px;float:left;}\
		.jqe-plugin-Reference .refer_item span.url{float:none;display:block;}\
		.jqe-plugin-Reference .refer_item p{display:inline-block;}\
		.jqe-plugin-Reference .gray{color:#999999;}\
		.jqe-plugin-Reference p.top{padding:10px 5px;margin-bottom:10px;}\
		.jqe-plugin-Reference .top a{float:right;}\
		.jqe-plugin-Reference .top span{float:left;}\
		.jqe-plugin-Reference #editor_mod{background:none repeat scroll 0 0 #F8F8F8;}\
		.jqe-plugin-Reference #editor_mod .editor_p{padding-bottom:10px;display:block;}\
		.jqe-plugin-Reference #editor_mod a{margin-left:10px;}\
		.bgcolor {background-color:#DDE;}\
		.jqe-plugin-Reference #editor_mod input{border:1px solid #7F9DB9;padding:2px 6px;height:15px;color:#111111;}',
	init: function( self ){
		self.cache['html'] = '<div class="jqe-plugin-Reference">\
			<p class="top"><a href="javascript:void(0);" name="add">新增批注</a></p>\
			<ul id="referlist">数据初始化中....</ul></div>';
	},
	one1 : function( panel, self ) {
		var date = Util.tmp_ajax_date;
		if(date){
			$('#referlist').html(date.join(''));
			//Util.tmp_ajax_date = null;
		}else {
			$('#referlist').html('');
		}
	},
	action : function( target, panel, self ) {
		var fun = target.closest('[name]').attr("name"),
			util = Util;
		if(typeof Funs[fun] === Consts.typeof_function) {
			if(!util.ajaxBusy){
				Funs[fun](target, panel, self);

			}
		}
		if($.nodeName(target[0], 'a')){
			return false;
		}
	},
	ok:function () {
	},
	onclose : function(panel , self) {
		self.is_editoring = false;
	},
	callback : function(panel , self) {
		if(self.is_editoring){
			panel.find(':checkbox').hide().attr('checked',false);
			panel.find('a[name=add]').hide();
		}else {
			panel.find('a[name=add]').show();
		}
		$(panel).find('#referlist li').live({mouseenter:function () { $(this).addClass('bgcolor');},mouseleave:function () { $(this).removeClass('bgcolor');}});
		panel.find(":submit").remove();
		panel.find(":button").val("关闭");

		var date = Util.tmp_ajax_date;

		if(date){
			$('#referlist').html(date.join(''));
			//Util.tmp_ajax_date = null;
		}else {
			$('#referlist').html('');
		}
	},
	//响应快捷菜单编辑功能回调
	editor_callback : function(id, self) {
		self.is_editoring = true;
		self.click(E.mod('Panel'),self);
		//如果当前该记录处于编辑状态则不需要触发click事件
		if($('#'+id+':visible').length){
			$('#'+id+':visible').find('a[name=editor]').eq(0).click();
		}
	},

	// 保存参考资料对外接口
	// 上传图片时，如果填写了图片来源，需同时生成参考资料
	save: function(parms, callback){
		var ajaxUrl = typeof self.getSaveUrl === 'function' ? self.getSaveUrl() : defaultSaveUrl,
			util = Util,
			data = parms,
			refers = $('#else_content');
		if ( parms.title != '')
		{
			util.ajax(ajaxUrl,parms,function(data){
				if(data.flag == '1'){
					parms.id = data.result;
					parms.index = refers.children('dl').size()+1;
					//参考资料保存成功
					callback({id:parms.id, index:parms.index});
				}else {
					alert(data.result||'数据提交失败！');
				}
			},function(xmlhttp, status){
				if( status != 'success' ){
					//参考资料保存失败
					callback(null);
				}
			});
		} else {
			//参考资料填写不全
			callback(null);
		}
	},

	//插入图片时同步参考资料列表
	addOne:function (data) {
		data.index = Util.tmp_ajax_date.length+1;
		//弹窗里面的记录
		var li_html = Util.getReferMod(data);
		Util.tmp_ajax_date.push(li_html);

		//如果弹窗打开过,刚追加li结点,方便copy用
		if( $('#referlist').size() ){
			$('#referlist').append(li_html);
		}else{
			//编辑框下面的内容
			data.site = data.site == '' ?'':data.site+'：';
			var html = Util.dl_mod.replace('[id]',data.id).replace('[index]',data.index).replace('[site]',data.site).replace('[title]', data.title).replace('[url]', data.url);
			setTimeout(function(){$('#else_content').append(html)},100);
		}
		//Util.copy();
	},
	initData: function(){
		Util.initDate();
	}
});

var Funs = {
	//添加处理方法
	add : function(target, panel, self) {
		var refers = $('#referlist'),
			mod = refers.find('#editor_mod');
		if(!mod.length){
			mod = $(Util.getAddMod());
		}else if(mod.attr('editor_id')){
			//显示正在被编辑的记录
			$('#'+mod.attr('editor_id')).show();
		}
		//去除编辑标志并显示编辑界面
		mod.attr('editor_id','').show();
		mod.find('span[name=figtitle]').text(refers.children().not('#editor_mod').length+1+'.标题：');
		mod.find('input[name=title]').val('');
		mod.find('input[name=site]').val('');
		mod.find('input[name=url]').val(defaulturl);
		refers.append(mod).scrollTop(9999);
		mod.find('input[name=title]').focus();
	},
	//保存按钮处理方法
	save : function(target, panel, self,callback) {
		var refers = $('#referlist'),
			doctitle = $('#_doc_title').val(),
			addview = $('#editor_mod'),
			title = $.trim(addview.find('[name=title]').val()),
			url = $.trim(addview.find('[name=url]').val()),
			site = $.trim(addview.find('[name=site]').val()),
			editorid = addview.attr('editor_id'),
			saving = addview.children('p[name=saving]'),
			fig = false,
			data = null,
			util = Util,
			dom = E.get('document'),
			ajaxUrl = typeof self.getSaveUrl === 'function' ? self.getSaveUrl() : defaultSaveUrl;
		if(!title.length) {
			alert('提示：请输入参考资料的名称。');
			addview.find('[name=title]').focus();
			return ;
		}
		if (url == 'http:/'+'/'){
			url = '';
		}
		if (url != '' && !/^https?:\/\/([\w-]+\.)+[\w-]+(\/[\w.\/?%&= -]*)?/i.test(url)){
			alert('提示：请输入一个有效的网址。');
			addview.find('[name=url]').focus();
			return;
		}
		//判断是否名称重复
		refers.find('span.title:visible').each(function(i,item){
			if($.trim($(item).text()).replace(/^\d+\./, '') == title){
				fig = true;
				return false;
			}
		});
		if(fig){
			return alert('提示：您要添加的参考资料名称已经存在。');
		}
		parms = {doc_title: doctitle,title: title,url: url,nodeName:site};
		saving.show().prev('p').hide();

		util.ajax(ajaxUrl,parms,function(data){
			if(data.flag == '1'){
				parms.id = data.result;
				parms.site = parms.nodeName; //供下面同步用
				parms.index = refers.children(':visible').index(addview)+1;
				if(editorid) {//编辑
					$('#'+editorid).replaceWith(util.getReferMod(parms));
					if(self.is_editoring) {
						$('#'+parms.id).find(':checkbox').hide().attr('checked',false);
					}
					//修改页面中的所有name=editorid的sup节点name属性
					util.updateNodesName(util.getElementsByName('sup' , editorid , dom) , parms.id);
				}else {//新增
					var tmp = $(util.getReferMod(parms));
					refers.append(tmp);
					tmp.find('input[name=referbox]').attr('checked',true);
				}
				util.ajaxBusy = false;
				if (typeof callback == 'function'){
					callback (parms);
				}
				addview.hide();
				addview.find('input[name=title]').val('');
				addview.find('input[name=site]').val('');
				addview.find('input[name=url]').val(defaulturl);

			}else {
				alert(data.result||'数据提交失败！');
			}
		},function(){
			saving.hide();
			saving.prev('p').show();
		});
	},
	saveAndinsert:function (target, panel, self) {
		Funs.save (target, panel, self,function (parms) {
			var html=[],
			util = Util,
			Reference = E.plugin(pluginName),
			refer_item = $ ('#'+parms.id),
			refer_title = refer_item.find('span.title').text(),
			refer_num = refer_title.substring(0,refer_title.indexOf('.'));
			if(util.ajaxBusy){
				return false;
			}
			html.push('<sup class="'+referClass+'" name="'+ refer_item.attr('id') +'">['+refer_num+']</sup>');
			Reference.pasteHTML(html.join('')+' ');
			$(panel).find('.jqe-panel-close').trigger('click');
			return false;
		});
	},
	//点击li添加参考资料
	liclick: function(target, panel, self){
		var html=[],
			refers = $('#referlist'),
			mod = refers.find('#editor_mod:visible'),
			util = Util,
			Reference = E.plugin(pluginName);
		if(util.ajaxBusy){
			return false;
		}

		var refer_item = $(target).closest('li.refer_item'),
			refer_title = refer_item.find('span.title').text(),
			refer_num = refer_title.substring(0,refer_title.indexOf('.'));
		html.push('<sup class="'+referClass+'" name="'+ refer_item.attr('id') +'">['+refer_num+']</sup>');

		Reference.pasteHTML(html.join('')+' ');
		$(panel).find('.jqe-panel-close').trigger('click');
		return false;
	},
	//取消按钮处理方法
	cancel : function(target, panel, self) {
		var addview = $('#editor_mod');
		if(addview.attr('editor_id')){
			$('#'+addview.attr('editor_id')).show();
		}
		addview.attr('editor_id','').hide();
		addview.find('input[name=title]').val('');
		addview.find('input[name=url]').val(defaulturl);
	},
	//删除按钮处理方法
	remove : function(target, panel, self) {
		if(!confirm('确定删除?')){
			return;
		}
		var refers = $('#referlist'),
			addview = $('#editor_mod:visible'),
			util = Util,
			title='',
			index=0,
			dom = E.get('document'),
			refer = $(target).closest('li'),
			tmp_id = refer.attr('id');
		refer.remove();
		//删除编辑器中节点
		util.removeNodes(util.getElementsByName('sup',tmp_id,dom));
		//重置弹出框中的编号和编辑器中编号
		refers.children().not('#editor_mod').each(function(i,item){
			item = $(item);
			tmp_id = item.attr('id');
			title = item.find('span.title').text().replace(/^\d+\.+/,'');
			index = i+1;
			item.find('span.title').text(index+"."+title);
			//批量修改编辑器中所有标记索引值
			util.updateNodesText(util.getElementsByName('sup',tmp_id,dom),index);
		});
		//修正编辑界面索引值
		if(addview.length) {
			index = refers.children(':visible').index(addview)+1;
			addview.find('span[name=figtitle]').text(index+'.标题：');
		}
		//同步编辑器下方参考资料模块内容
		Util.copy();
	},
	//编辑按钮处理方法
	editor : function(target, panel, self) {
		var refer = $(target).closest('li').hide(),
			util = Util,
			id = refer.attr('id'),
			title = refer.find('span.title').text(),
			url = refer.find('span.url').text() ? refer.find('span.url').text() : defaulturl,
			addview = $('#editor_mod'),
			index = 0,
			temp = title.split ('：');
			site = temp.length > 1 ? temp.shift()  : '';
			title = temp.join('：');
		if(addview.length == 0){
			addview = $(util.getAddMod());
		}else if(addview.attr('editor_id')) {
			$('#'+addview.attr('editor_id')).show();
		}
		refer.after(addview);
		addview.show();
		index = $('#referlist').children(':visible').index(addview)+1;
		addview.find('span[name=figtitle]').text(index+'.标题：');
		addview.attr('editor_id',id);
		addview.find('input[name=title]').val(title.replace(/^\d+\.+/,''));
		addview.find('input[name=url]').val(url);
		addview.find('input[name=site]').val(site.replace(/^\d+\.+/,''));
		addview.find('input[name=title]').focus();
	}
};

var Util = {
	ajaxBusy : false,
	//缓存初始化时候栓选出来的数据
	tmp_ajax_date : null,
	//获取编辑模版
	getAddMod : function() {
		return '<li id="editor_mod" editor_id="">\
			<p class="editor_p"><span name="figtitle"></span><input type="text" name="title" size="55" maxlength="300"></p>\
			<p class="editor_p"><span>&nbsp;&nbsp;网址：</span><input type="text" name="url" value="'+defaulturl+'" size="55" maxlength="255" onfocus="this.value == \''+defaulturl+'\' ? this.select(): void(0);" onmouseup="this.value == \''+defaulturl+'\' ? this.select(): void(0);return false;"></p>\
			<p class="editor_p"><span >&nbsp;&nbsp;网站名：</span><input type="text" name="site" size="55" maxlength="300"></p>\
			<p class="editor_p"><a href="javascript:void(0);" name="saveAndinsert">保存并插入批注</a><a href="javascript:void(0);" name="save">保存</a>\
			<a href="javascript:void(0);" name="cancel">取消</a></p>\
			<p style="display: none;" name="saving">正在进行保存，请稍等... </p>\
		</li>';
	},
	//获取一条记录模版
	getReferMod : function(parms) {
		var modhtml = '<li id="[id]" class="refer_item" title="点击插入该参数资料" name="liclick" site="[nodeName]"><input type="checkbox" value="" name="referbox" style="display:none;">\
				<p><span class="title">[site][title]</span><a href="javascript:void(0);" name="editor">编辑</a>\
				<a href="javascript:void(0);" name="remove">删除</a></p>\
				<p class="gray"><span class="url">[url]</span></p></li>',
				site = '';
			if (parms.nodeName != '' && parms.nodeName != 'undefined'){
				site = parms.nodeName+'：';
			}
		return modhtml.replace(/\[id\]/g,parms.id)
			.replace(/\[nodeName\]/g,parms.nodeName)
			.replace(/\[site\]/g,parms.index+"."+site)
			.replace(/\[title\]/g,parms.title)
			.replace(/\[url\]/g,parms.url);
	},
	//批量删除节点
	removeNodes : function(nodes) {
		for(var i = 0 ;i < nodes.length ; i++) {
			nodes[i].parentNode.removeChild(nodes[i]);
		}
	},
	//批量修改节点text值
	updateNodesText : function(nodes, index) {
		for(var i = 0 ; i < nodes.length ; i++) {
			nodes[i].innerHTML = '['+index+']';
		}
	},
	//批量修改节点name属性值
	updateNodesName : function(nodes,name) {
		for(var i = 0 ; i < nodes.length ; i++) {
			nodes[i].setAttribute('name',name);
		}
	},
	/*
		url : 请求地址
		parms : 请求附带参数
		callback : 成功回调
		complete : 请求结束回调
	*/
	ajax : function(url,parms,callback,complete) {
		var self = this;
		if(self.ajaxBusy) {
			return ;//alert('请稍后...');
		}else {
			self.ajaxBusy = true;
		}
		$.ajax({
			type: "post",
			url: url,
			dataType: "json",
			data: parms,
			success: function(result){
				callback(result);
				//每次交互都会有内容变化，因此在次出需要复制一次参考资料内容
				Util.copy();

			},
			complete: function( xmlhttp, status ) {
				if(typeof complete === 'function') {
					complete(xmlhttp, status);
				}
				if( status !== 'success' ){
					alert( '提示：由于网络或服务器暂时出现故障，添加失败！\n\n请稍候再试。' );
				}
				self.ajaxBusy = false;
			}
		});
	},
	//在指定content范围内获取指定name属性的tag标签
	getElementsByName : function(tag, name, content) {
		var tmp_node = null,
			rtn = [],
			dom = content || document,
			tags = dom.getElementsByTagName(tag);
		for(var i = 0 ; i < tags.length ; i++) {
			tmp_node = tags[i];
			if(tmp_node.getAttribute('name') == name) {
				rtn.push(tmp_node);
			}
		}
		return rtn;
	},
	//设置有效数据，并删除无效数据
	initDate : function() {
		var doctitle=$('#_doc_title').val() || $('#doctitle').val();
		var self = this,
			util = Util,
			item = null,
			html = [],
			tmp_name = null,
			tmp_data = null,
			index = 1;
			dom = E.get('document'),
			dl_mod = self.dl_mod,
			all_dl = [refer_value],
			tmp = {},
			article_refers = dom.getElementsByTagName('sup'),
			parms = {doc_title:doctitle,type:1};
		util.ajax(defaultSelectUrl, parms, function(data){
			if (typeof data == 'object'){
				for(var i = 0 ;i < article_refers.length ; i++) {
					item = article_refers[i];
					tmp_name = item.getAttribute('name');
					if(data[tmp_name] != undefined) {
						tmp_data = data[tmp_name];
						if(!tmp[tmp_name]){
							tmp_data.id = tmp_name;
							tmp_data.index = index++;
							html.push(util.getReferMod(tmp_data));
							tmp_data.nodeName = tmp_data.nodeName == '' ?'':tmp_data.nodeName+'：';
							all_dl.push(dl_mod.replace('[id]',tmp_name).replace('[index]',tmp_data.index).replace('[site]',tmp_data.nodeName).replace('[title]', tmp_data.title).replace('[url]', tmp_data.url));
							tmp[tmp_name] = tmp_data;
						}
					} else if(item.getAttribute('name')){
						//如果不存在则认为无效，直接删除，注意：dom删除操作会直接实时更新nodelist的length
						item.parentNode.removeChild(item);
						i--;
					}
				}
				util.tmp_ajax_date = html;
				$('#else_content').html(all_dl.join(''));
			}
		});
	},
	dl_mod : '<dl name="[id]" ><dt><strong>[index]、</strong>[site][title]</dt><dd>[url]</dd></dl>',
	/*
		实时同步参考资料到下面参考资料区域
	*/
	copy : function(){
		var self = this,
			html = [refer_value], referlist = [],item = null,
			id = '', title = '',site = '', index = 0, dl_mod = self.dl_mod;
		if($('#referlist').length == 0)return ;
		$('#referlist').children('li.refer_item').each(function(i){
			item = $(this);
			index = i+1;
			id = item.attr('id');
			url = item.find('.url').text();
			nodeName = item.attr('site') == undefined ? '' : item.attr('site');
			title = item.find('.title').text().replace(/^\d+\.+/, '');
			temp = title.split ('：');
			site = temp.length > 1 ? temp.shift()  : '';
			site = site == '' ?'':site+'：';
			title = temp.join('：');
			html.push(dl_mod.replace('[id]',id).replace('[index]',index).replace('[site]', site).replace('[title]', title).replace('[url]', url));
			var parms = {id:id,url:url,index:index,title:title,nodeName:nodeName};
			referlist.push(Util.getReferMod(parms));
		});

		// 将数据同步到临时对象里面去
		Util.tmp_ajax_date = referlist;

		$('#else_content').html( html.join(''));
	}
};
window.Util1 = Util;
})(jQEditor);